package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import models.Produto;
import models.Tag;

public class ProdutoDAO {

	Connection conexao;

	public ProdutoDAO(Connection openConexaoBanco) {
		this.conexao = openConexaoBanco;
	}

	public boolean cadastrarProduto(Produto produto, String _tagID) {
		boolean retorno = false;
		try {
			String comando = "insert into produto (descricao, imagem, nome, preco, quantidade)"
					+ "values(?,?,?,?,?)";

			PreparedStatement p = this.conexao.prepareStatement(comando);

			p.setString(1, produto.getDescricao());
			p.setString(2, produto.getImagem());
			p.setString(3, produto.getNome());
			p.setString(4, produto.getPreco() + "");
			p.setString(5, produto.getQuantidade() + "");

			p.execute();

			String comando2 = "insert into produto_tag (produto_id, tag_id)"
					+ "values(?,?)";

			PreparedStatement p2 = this.conexao.prepareStatement(comando2);

			p2.setString(1, buscarID(produto.getNome()));
			p2.setString(2, _tagID);

			p2.execute();

			retorno = true;

		} catch (SQLException e) {
			System.out
					.println("Ocorreu erro na hora de inserir o PRODUTO try catch");
			e.printStackTrace();
		}
		return retorno;
	}

	public boolean alterarProduto(Produto novoProduto) {
		boolean retorno = false;
		try {
			String comandoAlterar = "UPDATE produto SET  nome = ?, "
					+ "descricao = ?, " + "imagem = ?, " + "preco = ?, "
					+ "quantidade = ?" + "WHERE  produto.id = ?;";

			PreparedStatement p = this.conexao.prepareStatement(comandoAlterar);

			p.setString(1, novoProduto.getNome());
			p.setString(2, novoProduto.getDescricao());
			p.setString(3, novoProduto.getImagem());
			p.setString(4, novoProduto.getPreco() + "");
			p.setString(5, novoProduto.getQuantidade() + "");
			p.setString(6, novoProduto.getId() + "");

			p.execute();

			retorno = true;

		} catch (SQLException e) {
			System.out
					.println("Ocorreu erro na hora de inserir o PRODUTO try catch");
			e.printStackTrace();
		}
		return retorno;
	}

	public String buscarID(String _nome) {

		String resultado = "";
		try {
			String comando = "select id from produto where nome='" + _nome
					+ "';";
			java.sql.Statement start = conexao.createStatement();
			ResultSet rs = start.executeQuery(comando);

			while (rs.next()) {
				resultado = (rs.getString("id"));
				break;
			}

		} catch (Exception e) {
			// TODO: handle exception
		}

		return resultado;
	}

	public Produto buscarPorID(String id) {

		Produto produto = new Produto();
		produto.setId(Integer.parseInt(id));

		try {
			String comando = "select * from produto where id='" + id + "';";
			java.sql.Statement start = conexao.createStatement();
			ResultSet rs = start.executeQuery(comando);

			rs.first();
			produto.setDescricao(rs.getString("descricao"));
			produto.setImagem(rs.getString("imagem"));
			produto.setNome(rs.getString("nome"));
			double preco = Double.parseDouble(rs.getString("preco"));
			produto.setPreco(preco);
			produto.setQuantidade(rs.getInt("quantidade"));

		} catch (Exception e) {
			// TODO: handle exception
		}

		return produto;
	}

	public List<Produto> listarProdutosPorNome(String busca) {
		List<Produto> listaProdutos = new ArrayList<Produto>();

		String comando = "SELECT * FROM produto WHERE (descricao LIKE '%"
				+ busca + "%' ) " + " OR (nome LIKE '%" + busca + "%') ";
		try {
			System.out.println("toh aqui");
			java.sql.Statement start = conexao.createStatement();
			ResultSet rs = start.executeQuery(comando);

			while (rs.next()) {
				System.out.println("prox.");
				Produto produto = new Produto();
				int idProduto = Integer.parseInt(rs.getString("id"));

				produto.setId(idProduto);
				produto.setDescricao(rs.getString("descricao"));
				produto.setImagem(rs.getString("imagem"));
				produto.setNome(rs.getString("nome"));

				int quantidade = Integer.parseInt(rs.getString("quantidade"));
				double preco = Double.parseDouble(rs.getString("preco"));

				produto.setQuantidade(quantidade);
				produto.setPreco(preco);

				listaProdutos.add(produto);
			}

		} catch (Exception e) {
			// TODO: handle exception
		}

		return listaProdutos;
	}

	public List<Produto> listarTodos() {
		List<Produto> listaProdutos = new ArrayList<Produto>();
		try {
			String comando = "select * from produto";
			java.sql.Statement start = conexao.createStatement();
			ResultSet rs = start.executeQuery(comando);

			while (rs.next()) {
				Produto produto = new Produto();
				int idProduto = Integer.parseInt(rs.getString("id"));

				produto.setId(idProduto);
				produto.setDescricao(rs.getString("descricao"));
				produto.setImagem(rs.getString("imagem"));
				produto.setNome(rs.getString("nome"));

				int quantidade = Integer.parseInt(rs.getString("quantidade"));
				double preco = Double.parseDouble(rs.getString("preco"));

				produto.setQuantidade(quantidade);
				produto.setPreco(preco);

				listaProdutos.add(produto);
			}

		} catch (Exception e) {
			// TODO: handle exception
		}

		return listaProdutos;
	}

	public boolean inserirComentario(String _conteudo, String _nome,
			String _produto_id) {
		// TODO Auto-generated method stub

		boolean retorno = false;
		try {
			String comando = "insert into comentario (conteudo, produto_id, nome_usuario)"
					+ "values(?,?,?)";

			PreparedStatement p = this.conexao.prepareStatement(comando);

			p.setString(1, _conteudo);
			p.setString(2, _produto_id);
			p.setString(3, _nome);

			p.execute();

			retorno = true;

		} catch (SQLException e) {
			System.out
					.println("Ocorreu erro na hora de inserir o COMENTARIO try catch");
			e.printStackTrace();
		}
		return retorno;
	}

	public boolean addTagAoProduto(String _id, String _tagID) {
		boolean retorno = false;
		try {
			String comando2 = "insert into produto_tag (produto_id, tag_id)"
					+ "values(?,?)";

			PreparedStatement p2 = this.conexao.prepareStatement(comando2);

			p2.setString(1, _id);
			p2.setString(2, _tagID);

			p2.execute();

			retorno = true;

		} catch (SQLException e) {
			System.out
					.println("Ocorreu erro na hora de inserir TAG AO PRODUTO try catch");
			e.printStackTrace();
		}
		return retorno;
	}

	public boolean excluirProduto(String _id) {
		boolean retorno = false;
		try {
			String comando0 = "delete from comentario where produto_id=?;";
			PreparedStatement p0 = this.conexao.prepareStatement(comando0);
			p0.setString(1, _id);
			
			p0.execute();
		} catch (SQLException e) {
			System.out
					.println("Ocorreu erro na hora de excluir a COMENTARIO DO PRODUTO try catch");
			e.printStackTrace();

		}
		
		try {
			String comando1 = "delete from produto_tag where produto_id=?;";
			PreparedStatement p = this.conexao.prepareStatement(comando1);
			p.setString(1, _id);
			
			p.execute();
		} catch (SQLException e) {
			System.out
					.println("Ocorreu erro na hora de excluir a TAG DO PRODUTO try catch");
			e.printStackTrace();

		}
		
		try {


			String comando3 = "delete from lista_presentes where produto_id=?;";
			PreparedStatement p3 = this.conexao.prepareStatement(comando3);
			p3.setString(1, _id);

			p3.execute();
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println("Ocorreu erro na hora de excluir a PRODUTO NA LISTA DE PRESENTES try catch");

		}
		
		try {


			String comando2 = "delete from produto where id=?;";
			PreparedStatement p2 = this.conexao.prepareStatement(comando2);
			p2.setString(1, _id);

			p2.execute();
			retorno = true;
		} catch (SQLException e) {
			System.out
					.println("Ocorreu erro na hora de excluir a PRODUTO try catch");
			e.printStackTrace();

		}
		return retorno;
	}

	public List<Produto> listarProdutosCarrinhoUsuario(int id) {
		List<Produto> listaProdutos = new ArrayList<Produto>();
		try {
			String comando = "select * from lista_presentes where usuario_id="+id+";";
			java.sql.Statement start = conexao.createStatement();
			ResultSet rs = start.executeQuery(comando);

			while (rs.next()) {
				Produto produto = new Produto();
				int idProduto = Integer.parseInt(rs.getString("produto_id"));
				
				produto = this.buscarPorID(idProduto+"");
				listaProdutos.add(produto);
			}

		} catch (SQLException e) {
			System.out.println("Erro ao LISTAR PRODUTOS do carrinho try catch!!");
			e.printStackTrace();
		}

		return listaProdutos;
	}

	public void excluirProdutoCarrinhoUsuario(String id_usuario, String id_produto) {
		try {


			String comando2 = "delete from lista_presentes where usuario_id=? and produto_id=?;";
			PreparedStatement p2 = this.conexao.prepareStatement(comando2);
			p2.setString(1, id_usuario);
			p2.setString(2, id_produto);
			
			p2.execute();
		} catch (SQLException e) {
			System.out
					.println("Ocorreu erro na hora de excluir a PRODUTO NO CARRINHO try catch");
			e.printStackTrace();

		}
	}
	
	public List<Produto> buscarPorTag(Tag tag) {
		List<Integer> listaIds = new ArrayList<Integer>();; 
		try {
			String comando = "select * from produto_tag where tag_id='"+tag.getId()+"';";
			java.sql.Statement start = conexao.createStatement();
			ResultSet rs = start.executeQuery(comando);
			
			while(rs.next()){
				listaIds.add(rs.getInt("produto_id"));
			}
			
			List<Produto> lista = this.buscarPorIds(listaIds);
			return lista;
		} catch (Exception e) {
			return new ArrayList<Produto>();
		}
	}
	private List<Produto> buscarPorIds(List<Integer> listaIds) {
		List<Produto> lista = new ArrayList<Produto>();
		for(Integer id : listaIds){
			lista.add( this.buscarPorID(id.toString()) );
		}
		return lista;
	}

}
